package cn.wolfcode.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @SentinelResource的使用
 *
 * **定义限流和降级后的处理方法**
 */
@RestController
@Slf4j
public class AnnoController {

    // 当使用了SentinelResource, 需要设置当出现流控的时候，应该返回什么的信息，更细粒度控制返回信息
    // 当出现流控的流控的时候，不想使用默认信息，需要额外做些事情的情况下，需要使用SentinelResource
    @SentinelResource(value = "anno1",
            blockHandler="anno1BlockHandler",  // 出现流控，想额外处理
            fallback = "anno1Fallback"         // fallback相当于统一异常处理
    )
    @RequestMapping("/anno1")
    public String anno1(String name){
        if("wolfcode".equals(name)){
            throw new RuntimeException();
        }
        return "anno1";
    }

    // 出现流控，想额外处理;
    public String anno1BlockHandler(String name, BlockException ex){
        // 在这里做一些额外的处理，比如发短息，发送邮件通知管理员，将信息写入数据库等
        log.error("{}", ex);
        return "接口被限流或者降级了";
    }

    //Throwable时进入的方法，这个方法捕获异常，相当于统一异常处理
    // String name 必须跟抛异常的方法形参一致才可以捕获
    public String anno1Fallback(String name,Throwable throwable) {
        log.error("{}", throwable);
        return "接口发生异常了";
    }
}
